// async / await 本质上就是 generator 的语法糖，内置执行器，无需手动执行 next() 方法
// Generator 函数，可以通过 yield 关键字，把函数的执行流挂起，通过next()方法可以切换到下一个状态，为改变执行流程提供了可能，从而为异步编程提供解决方案。

// 返回 Promise
function runGenerator(gen) {
  //把返回值包装成promise
  return new Promise((resolve, reject) => {
    var g = gen()

    function _next(val) {
      //错误处理
      try {
        var res = g.next(val)
      } catch (err) {
        return reject(err);
      }
      if (res.done) {
        return resolve(res.value);
      }
      //res.value包装为promise，以兼容yield后面跟基本类型的情况
      Promise.resolve(res.value).then(
        val => {
          _next(val);
        },
        err => {
          //抛出错误
          g.throw(err)
        });
    }
    _next();
  });
}


function* myGenerator() {
  const res1 = yield Promise.resolve(1);
  console.log('res1', res1); // 1
  const res2 = yield Promise.resolve(2);
  console.log('res2', res2); // 2
  const res3 = yield Promise.resolve(3);
  console.log('res3', res3); // 3
}

const gen = runGenerator(myGenerator); // 
console.log(gen); //undefined (还需要实现返回promise)
